package MyMybatis;

import MyMybatis.entity.Student;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        //用SqlSessionFactory创建一个连接sqlSessionFactory连接，用的是读取配置文件的方式，文件目录以src平级的目录算根目录,在src目录下的话，要从src开始写
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("src/MyMybatis/mybatis-config.xml"));
        try(SqlSession sqlSession = sqlSessionFactory.openSession(true);
            SqlSession sqlSession1 = sqlSessionFactory.openSession(true)){  //把openSession类比成statement理解,用SqlSession接收对象类型
            //openSession()括号里要填写布尔类型，表示是否自动提交，类似于事务，如果false的话要手动提交。
            //openSession()使用完成后要手动关闭，但我们放在try-with-resources里
            //暂时没有业务的时候，可以先空跑一下，看是否报错，配置文件是否找到
            /*
            那么SqlSessionFactory对象是什么东西呢？
            SqlSessionFactoryBuilder
                       |    1
                       |    builder()
                       |
                      \|/   1
                SqlSessionFactory     //SqlSessionFactory是由SqlSessionFactoryBuilder创建出来的，1对1的关系
                       |    1
                       |    openSession()
                       |
                      \|/   N
                   SqlSession         //SqlSession则是由SqlSessionFactory创建出来，1对多关系
             每个基于Mybatis的应用都是以一个SqlSessionFactory的实例为核心的，我们可以通过SqlSessionFactory创建多个会话（SqlSession对象），
             每个会话相当于不同的地方或不同的应用去连接数据库，每个会话互相隔离
             通过SqlSession可以完成几乎所有的数据库操作，这个接口定义了大量的数据库操作方法，因此，现在我们只需要通过一个对象就能完成数据库交互了，极大简化了之前的流程。
             */
            //尝试一下直接读取实体类，读取实体类肯定需要一个映射规则，比如类中的哪个字段对应数据库中的哪个字段，在查询语句返回结果后，Mybatis就会自动将对应的结果填入到对象的对应字段上。
            //首先编写实体类Student，用上小辣椒Lombok,写好TestMapper.xml映射器，映射数据查询结果字段和类的字段，在Mybatis-config.xml里添加映射器，最后在代码里使用定义好的Mapper即可
            List<Student> list = sqlSession.selectList("selectStudent"); //使用SqlSession的selectList方法，将查询结果转换为List类型数据，存储的数据为Student类型。
            //sqlSession.selectList()方法里，填写Mapper.xml映射器里的id字段
            list.forEach(System.out::println);
            //我们会发现，mybatis非常智能，我们只需要告诉一个映射关系，就能够直接将查询结果转换为一个实体类。
            //还可以查询某个id的，而不是把所有结果返回，我们新创建1个映射器，在TestMapple1.xml里修改select语句，把字段用#{sid}表示，并修改
            System.out.println((Student) sqlSession1.selectOne("selectStudent1", 1940618804)); //这里用同一个SqlSession也可以。查询结果转换为Student类

        }
    }

}
